package com.shujia.ml

import org.apache.spark.ml.classification.LogisticRegression
import org.apache.spark.sql.{DataFrame, Dataset, Row, SparkSession}

object Code04LogisticRegression {
  def main(args: Array[String]): Unit = {
    val spark: SparkSession = SparkSession
      .builder()
      .master("local[*]")
      .appName("spark")
      .getOrCreate()

    val dataFrame: DataFrame = spark.read.format("libsvm").load("spark_code/data/ml/人体指标.txt")
    //    dataFrame.show()
    // 调用逻辑回归算法


    val splitTrainTest: Array[Dataset[Row]] = dataFrame.randomSplit(Array(0.8, 0.2))
    val training: Dataset[Row] = splitTrainTest(0)
    val testing: Dataset[Row] = splitTrainTest(1)


    // 对于参数设置，可以通过查看公式 还可以使用网格搜索
    val lr = new LogisticRegression()
      .setMaxIter(10)
      .setRegParam(0.3)
      .setElasticNetParam(0.8)


    // Fit the model
    val lrModel = lr.fit(training) // 拟合训练

    // 如何判断模型的准确率
    val testTransform: DataFrame = lrModel.transform(testing)

    //    testTransform.show()

    // 测试集数据共有多少条
    val cnt: Long = testTransform.count()

    import spark.implicits._
    val predictTrueCnt: Long = testTransform.where($"label" === $"prediction").count()

    println(s"当前模型的计算准确率为：${Math.round((predictTrueCnt / cnt.toDouble) * 10000) / 100.0}%")

  }
}
